home *** CD-ROM | disk | FTP | other *** search
- // the implementation of class LINE_LIST
- // Copyright (C) 1996, 1997 Kazutaka Hirata <khirata@jove.acs.unt.edu>
-
- #include "../kbandef.h"
-
- #include "linelist.h"
-
- XY LINE_LIST::get_max() const
- {
- XY ac_max(X_MIN, Y_MIN);
- iterator i;
- TRAVERSE(*this, i) {
- ac_max = ::get_max(ac_max, i->get_max());
- }
- return ac_max;
- }
-
- XY LINE_LIST::get_min() const
- {
- XY ac_min(X_MAX, Y_MAX);
- iterator i;
- TRAVERSE(*this, i) {
- ac_min = ::get_min(ac_min, i->get_min());
- }
- return ac_min;
- }
-
- void LINE_LIST::shift(const XY& ac_dif, LINE_LIST& target) const
- {
- iterator i;
- TRAVERSE(*this, i) {
- target.push_back(i->shift(ac_dif));
- }
- }
-
- void LINE_LIST::unselect()
- {
- iterator i;
- TRAVERSE(*this, i) {
- i->unselect();
- }
- }
-
- void LINE_LIST::select_items_in_block(const XY& ac1, const XY& ac2)
- {
- iterator i;
- TRAVERSE(*this, i) {
- if(i->is_in_block(ac1, ac2)) {
- i->select();
- }
- }
- }
-
- void LINE_LIST::collect_selected_items(LINE_LIST& dst) const
- {
- iterator i;
- TRAVERSE(*this, i) {
- if(i->is_selected()) {
- dst.push_back(*i);
- }
- }
- }
-
- void LINE_LIST::remove_selected_items()
- {
- iterator i;
- TRAVERSE(*this, i) {
- if(i->is_selected()) {
- iterator current_i = i--;
- erase(current_i);
- }
- }
- }
-
- void LINE_LIST::collect_aperture(APT_TABLE& apt_table) const
- {
- iterator i;
- TRAVERSE(*this, i) {
- APERTURE apt(APERTURE::APT_ROUND, i->width(), 0, 0);
- if(!apt_table.is_included(apt)) {
- apt_table.push_back(apt);
- }
- }
- }
-
- int LINE_LIST::save(FILE_NEW& fp) const
- {
- FILE_VERSION fver;
- fp.printf("%s\n", fver.get_version_str(FILE_VERSION::VERSION_200A8));
-
- iterator i;
- TRAVERSE(*this, i) {
- i->save_200a8(fp);
- }
-
- fp.puts("end\n");
- return true;
- }
-
- int LINE_LIST::load_primitive_170(FILE_NEW& fp)
- {
- for(;;) {
- LINE_ELEMENT element;
- char str[1024];
- fp.gets_wo_return(str, 1024);
- if(!strcmp(str, "end")) {
- break;
- }
- element.load_primitive_170(str);
- push_back(element);
- }
- return true;
- }
-
- int LINE_LIST::load_component_170(FILE_NEW& fp)
- {
- for(;;) {
- LINE_ELEMENT element;
- char str[1024];
- fp.gets_wo_return(str, 1024);
- if(!strcmp(str, "end")) {
- break;
- }
- element.load_component_170(str);
- push_back(element);
- }
- return true;
- }
-
- uint LINE_LIST::load_get_version(FILE_NEW& fp) const
- {
- FILE_VERSION fver;
- char str[1024];
- fp.gets_wo_return(str, 1024);
- return fver.get_version_no(str);
- }
-
- LINE_LIST::LOAD_FUNC_INFO LINE_LIST::load_func_table[] = {
- {FILE_VERSION::VERSION_200A8 , &LINE_ELEMENT::load_200a8},
- {FILE_VERSION::VERSION_UNKNOWN, NULL }
- };
-
- LINE_LIST::LOAD_FUNC LINE_LIST::get_load_func(uint version) const
- {
- uint sentinel = FILE_VERSION::VERSION_UNKNOWN;
- uint index = search_info_table(load_func_table, sentinel, version);
- return load_func_table[index].func;
- }
-
- int LINE_LIST::load(FILE_NEW& fp)
- {
- int retval;
- uint version = load_get_version(fp);
- LOAD_FUNC load_func = get_load_func(version);
- if(load_func != NULL) {
- clear();
- for(;;) {
- LINE_ELEMENT element;
- char str[1024];
- fp.gets_wo_return(str, 1024);
- if(!strcmp(str, "end")) {
- break;
- }
- (element.*load_func)(str);
- push_back(element);
- }
- retval = true;
- } else {
- retval = false;
- }
- return retval;
- }
-
- bool LINE_LIST::is_there_nearest_point(XYT ac_min, const XY& ac) const
- {
- bool ret = false;
- iterator i;
- TRAVERSE(*this, i) {
- int r = maximum(i->width() / 2, (uint)ac_min);
- if(compare_distance_lt(ac, i->ac_s(), r)) {
- ret = true;
- break;
- }
- if(compare_distance_lt(ac, i->ac_e(), r)) {
- ret = true;
- break;
- }
- }
- return ret;
- }
-
- XY LINE_LIST::search_nearest_point(XYT ac_min, const XY& ac) const
- {
- XY ac_nearest(0, 0);
- iterator i;
- TRAVERSE(*this, i) {
- int r = maximum(i->width() / 2, uint(ac_min));
- if(compare_distance_lt(ac, i->ac_s(), r)) {
- ac_nearest = i->ac_s();
- break;
- }
- if(compare_distance_lt(ac, i->ac_e(), r)) {
- ac_nearest = i->ac_e();
- break;
- }
- }
- return ac_nearest;
- }
-
- LINE_ELEMENT* LINE_LIST::search(XYT eps, const XY& ac)
- {
- LINE_ELEMENT* p = NULL;
- iterator i;
- TRAVERSE(*this, i) {
- if(i->is_on_line(eps, ac)) {
- p = &*i;
- break;
- }
- }
- return p;
- }
-
- int LINE_LIST::purge_vertical_lines(LINE_ELEMENT& line)
- {
- int vcount = 0;
- iterator i;
- TRAVERSE(*this, i) {
- LINE_ELEMENT& current = *i;
- if((current.is_vertical() )
- && (line.ac_s().x() == current.ac_s().x())
- && (line.width() == current.width() )) {
- XYT min_a = minimum(line.ac_s().y(), line.ac_e().y());
- XYT max_a = maximum(line.ac_s().y(), line.ac_e().y());
- XYT min_b = minimum(current.ac_s().y(), current.ac_e().y());
- XYT max_b = maximum(current.ac_s().y(), current.ac_e().y());
- if((max_a < min_b) || (max_b < min_a)) {
- // do nothing
- } else {
- XYT actual_min = minimum(min_a, min_b);
- XYT actual_max = maximum(max_a, max_b);
- line.set_ac_s(XY(line.ac_s().x(), actual_min));
- line.set_ac_e(XY(line.ac_s().x(), actual_max));
- iterator current_i = i--;
- erase(current_i);
- vcount++;
- }
- }
- }
- return vcount;
- }
-
- int LINE_LIST::purge_holizontal_lines(LINE_ELEMENT& line)
- {
- int hcount = 0;
- iterator i;
- TRAVERSE(*this, i) {
- LINE_ELEMENT& current = *i;
- if((current.is_holizontal() )
- && (line.ac_s().y() == current.ac_s().y())
- && (line.width() == current.width() )) {
- XYT min_a = minimum(line.ac_s().x(), line.ac_e().x());
- XYT max_a = maximum(line.ac_s().x(), line.ac_e().x());
- XYT min_b = minimum(current.ac_s().x(), current.ac_e().x());
- XYT max_b = maximum(current.ac_s().x(), current.ac_e().x());
- if((max_a < min_b) || (max_b < min_a)) {
- // do nothing
- } else {
- XYT actual_min = minimum(min_a, min_b);
- XYT actual_max = maximum(max_a, max_b);
- line.set_ac_s(XY(actual_min, line.ac_s().y()));
- line.set_ac_e(XY(actual_max, line.ac_s().y()));
- iterator current_i = i--;
- erase(current_i);
- hcount++;
- }
- }
- }
- return hcount;
- }
-
- int LINE_LIST::purge_slash_lines(LINE_ELEMENT& line)
- {
- int scount = 0;
- iterator i;
- TRAVERSE(*this, i) {
- LINE_ELEMENT& current = *i;
- const XY& ac_p1 = line.ac_s();
- const XY& ac_p2 = current.ac_s();
- if((current.is_slash() )
- && ((ac_p1.x() - ac_p1.y()) == (ac_p2.x() - ac_p2.y()))
- && (line.width() == current.width() )) {
- XYT min_a = minimum(line.ac_s().x(), line.ac_e().x());
- XYT max_a = maximum(line.ac_s().x(), line.ac_e().x());
- XYT min_b = minimum(current.ac_s().x(), current.ac_e().x());
- XYT max_b = maximum(current.ac_s().x(), current.ac_e().x());
- if((max_a < min_b) || (max_b < min_a)) {
- // do nothing
- } else {
- XYT actual_min = minimum(min_a, min_b);
- XYT actual_max = maximum(max_a, max_b);
- line.set_ac_s(XY(actual_min, actual_min - ac_p1.x() + ac_p1.y()));
- line.set_ac_e(XY(actual_max, actual_max - ac_p1.x() + ac_p1.y()));
- iterator current_i = i--;
- erase(current_i);
- scount++;
- }
- }
- }
- return scount;
- }
-
- int LINE_LIST::purge_backslash_lines(LINE_ELEMENT& line)
- {
- int bcount = 0;
- iterator i;
- TRAVERSE(*this, i) {
- LINE_ELEMENT& current = *i;
- const XY& ac_p1 = line.ac_s();
- const XY& ac_p2 = current.ac_s();
- if((current.is_backslash() )
- && ((ac_p1.x() + ac_p1.y()) == (ac_p2.x() + ac_p2.y()))
- && (line.width() == current.width() )) {
- XYT min_a = minimum(line.ac_s().x(), line.ac_e().x());
- XYT max_a = maximum(line.ac_s().x(), line.ac_e().x());
- XYT min_b = minimum(current.ac_s().x(), current.ac_e().x());
- XYT max_b = maximum(current.ac_s().x(), current.ac_e().x());
- if((max_a < min_b) || (max_b < min_a)) {
- // do nothing
- } else {
- XYT actual_min = minimum(min_a, min_b);
- XYT actual_max = maximum(max_a, max_b);
- line.set_ac_s(XY(actual_min, - actual_min + ac_p1.x() + ac_p1.y()));
- line.set_ac_e(XY(actual_max, - actual_max + ac_p1.x() + ac_p1.y()));
- iterator current_i = i--;
- erase(current_i);
- bcount++;
- }
- }
- }
- return bcount;
- }
-
- int LINE_LIST::purge_lines()
- {
- LINE_LIST hline_list;
- LINE_LIST vline_list;
- LINE_LIST sline_list;
- LINE_LIST bline_list;
- LINE_LIST oline_list;
- int count = 0;
-
- iterator i;
- TRAVERSE(*this, i) {
- LINE_ELEMENT& current = *i;
- if(i->is_vertical()) {
- count += vline_list.purge_vertical_lines(*i);
- vline_list.push_back(*i);
- } else if(i->is_holizontal()) {
- count += hline_list.purge_holizontal_lines(*i);
- hline_list.push_back(*i);
- } else if(i->is_slash()) {
- count += sline_list.purge_slash_lines(*i);
- sline_list.push_back(*i);
- } else if(i->is_backslash()) {
- count += bline_list.purge_backslash_lines(*i);
- bline_list.push_back(*i);
- } else {
- oline_list.push_back(*i);
- }
- }
- clear();
- add(hline_list);
- add(vline_list);
- add(sline_list);
- add(bline_list);
- add(oline_list);
- return count;
- }
-
- void LINE_LIST::rotate_90()
- {
- iterator i;
- TRAVERSE(*this, i) {
- i->rotate_90();
- }
- }
-